#include "head.h"  // 包含自定义的头文件
#include "login.h" // 包含登录窗口的头文件
#include "games.h"
#include "changepassword.h" // 包含修改密码窗口的头文件
#include "registerpage.h"   // 包含注册窗口的头文件
#include <QApplication>     // 包含QApplication类，用于管理应用程序的控制流和主设置
#include "public.h"
// 全局变量
int pageType = 1;            // 记录当前页面类型（1:登录页，2:首页，3:注册页，4:修改密码页，5:demo）
int uId = 3;                 // 用户ID
int headImgType = 4;         // 头像类型
int sex = 1;                 // 用户性别 1男 0女
QString userName = "";       // 用户名
QString niceName = "";       // 昵称
QString charInputValue = ""; // 发送的消息
int uid = 999999;            // 用户唯一标识
HANDLE Tcp_hThread;          // 线程句柄，用于管理TCP接收数据的线程
SOCKET listenFd;             // 套接字，用于网络通信
tcp *tcpFn = nullptr;
MainWindow *home = nullptr;
int MessageListActiveIndex = 998;
vector<messageListStruct> messageListDatas;
vector<chatWindowListStruct> chatWindowListDatas;

/**
 * @brief 主函数，程序入口
 * @param argc 命令行参数个数
 * @param argv 命令行参数数组
 * @return 应用程序退出码
 */
int main(int argc, char *argv[])
{
    QApplication a(argc, argv); // 创建QApplication对象，管理应用程序的生命周期
    tcpFn = new tcp();
    // tcpFn->Tcp_handle_recv();
    // 创建各个窗口对象
    home = new MainWindow();       // 主窗口（首页）
    changePassword changePassword; // 修改密码窗口
    login login;                   // 登录窗口
    registerPage registerPage;     // 注册窗口
    games games;                   // demo窗口

    QObject::connect(tcpFn, &tcp::loginSuccess, [&]()
                     {
                         pageType = 2;  
                         login.close();
                         home->show();
                         tcpFn->tcp_send(1001); });

    // 连接信号和槽，用于从登录窗口跳转到注册窗口
    QObject::connect(&login, &login::toRegister, [&]()
                     {
                         pageType = 3;        // 设置页面类型为注册页
                         registerPage.show(); // 显示注册窗口
                         login.close();       // 关闭登录窗口
                         home->close();       // 关闭首页
                     });

    // 连接信号和槽，用于从注册窗口跳转到登录窗口
    QObject::connect(&registerPage, &registerPage::registerToLogin, [&]()
                     {
                         pageType = 1; // 设置页面类型为登录页
                         login.show(); // 显示登录窗口
                     });

    // 连接信号和槽，用于从修改密码窗口跳转到登录窗口
    QObject::connect(&changePassword, &changePassword::registerToLogin, [&]()
                     {
                         pageType = 1; // 设置页面类型为登录页
                         login.show(); // 显示登录窗口
                     });

    // 连接信号和槽，用于从登录窗口跳转到修改密码窗口
    QObject::connect(&login, &login::toChangePassword, [&]()
                     {
                         pageType = 4;          // 设置页面类型为修改密码页
                         changePassword.show(); // 显示修改密码窗口
                     });

    // 连接信号和槽，用于从主窗口跳转到demo页面
    QObject::connect(home, &MainWindow::toGamesPageFn, [&]()
                     {
                         pageType = 5;         
                         games.show(); });

    // 根据pageType的值决定初始显示的页面
    switch (pageType)
    {
    case 1:
        login.show(); // 显示登录窗口
        break;
    case 2:
        home->show(); // 显示首页
        break;
    case 3:
        registerPage.show(); // 显示注册窗口
        break;
    case 4:
        changePassword.show(); // 显示修改密码窗口
        break;
    case 5:
        games.show(); // 显示demo窗口
        break;
    default:
        break;
    }

    return a.exec(); // 进入主事件循环，等待用户操作
}